iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 21
0
自我挑戰組

30天學會Python系列 第 21

Python - Class類別(2) - 封裝Encapsulation

  • 分享至 

  • xImage
  •  

物件導向

物件導向的概念有三大特性分別為:

  • 封裝 (Encapsulation)
  • 繼承 (Inheritance)
  • 多型 (Polymorphism)

接下來我們會依序介紹這三種特性

封裝 (Encapsulation)

封裝的用意是要讓物件裡的資料隱藏起來,其他物件只能透過物件本身提供的介面存取裡面的資料,取得裡面的屬性(attribute)方法(method),也就是說,朕不給的,你不能要(誤,正確一點的說法是,我們只需要知道這個物件的外在就好,不需要知道物件是如何取得資料

讓我們來看一個例子:
首先,我們先定義一個人的類別叫做Person,這個人的類別有許多抽象的特性可以描述,例如名字、性別、身高、體重、生日等等等,下面可以看到程式碼如何定義一個類別

class Person:
    def __init__(self, name, gender, height, weight, birthday):
        self.name
        self.gender
        self.height
        self.weight
        self.birthday

p1 = Person("Peter", "male", 180.0, 70.0, "1987/8/7")
p2 = Person("Linda", "female", 160.0, 45.0, "1978/7/8")

上面的程式碼我們做了許多動作,一一解釋給大家

  • 定義類別
    首先我們定義了一個類別叫做Person,來描述一個人的各種屬性或是可能的行為
  • 初始化函數 init()
    我們在之前的文章有提到__init__()這個函數,在這裡我們定義了Person類別的初始化函數,也就是這個類別在實例化時的建構子(Constructor),在生成這個類別的實例的同時也賦予了我們給他的屬性
  • 實例化 instanize
    在最後一行我們創造了兩個Person類別的獨立的物件,也就是實例化,他們各自擁有自己的屬性

私有變數
再來我們替這個類別新增一些方法(method)並對某些屬性進行封裝,譬如我們想要得到這個人的BMI值,而且不想讓其他物件知道這個人的身高和體重,我們可以在變數前面加兩個下底線"__variable"這樣可以將變數變成私有變數,即只有物件內部才能夠取得資料,無法從外部物件取得

class Person:
    def __init__(self, name, gender, height, weight, birthday):
        self.name = name
        self.gender = gender
        self.__height = height
        self.__weight = weight
        self.birthday = birthday

    def get_BMI(self):
        return (self.__weight/ ((self.__height/100)**2))


p1 = Person("Peter", "male", 180.0, 70.0, "1987/8/7")
p2 = Person("Linda", "female", 160.0, 45.0, "1978/7/8")

當我們想要取得p1這個人的BMI值時,只要呼叫物件的get_BMI()函數,如下

p1.get_BMI()

但當我們想要取得p1這個人的身高體重時,因為__height為私有變數,則會出現錯誤

>>> p2.__height
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute '__height'

上一篇
Python - Class類別(1)
下一篇
Python - Class類別(3) - 繼承inheritance
系列文
30天學會Python30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言